nanopyx.methods.channel_registration.corrector

 1import numpy as np
 2from skimage.io import imread
 3
 4from ...core.transform.interpolation_bicubic import interpolate
 5
 6
 7class ChannelRegistrationCorrector(object):
 8    def __init__(self):
 9        self.aligned_stack = None
10
11    def load_translation_masks(self, path=None):
12        if path is not None:
13            path = input("Please provide a filepath to the translation masks")
14
15        return imread(path)
16
17    def align_channels(self, img_stack, translation_masks=None):
18        
19        translation_masks = translation_masks
20
21        if translation_masks is None:
22            translation_masks = self.load_translation_masks()
23
24        input_d_type = img_stack.dtype
25
26        n_channels = img_stack.shape[0]
27        height = img_stack.shape[1]
28        width = img_stack.shape[2]
29
30        self.aligned_stack = np.empty((n_channels, height, width))
31        channels_list = list(range(n_channels))
32
33        for channel in channels_list:
34            img_slice = img_stack[channel].astype(np.float32)
35            translation_mask = translation_masks[channel]
36            if np.sum(translation_mask) == 0:
37                self.aligned_stack[channel] = img_slice
38            else:
39                for y_i in range(height):
40                    for x_i in range(width):
41                        dx = translation_mask[y_i, x_i]
42                        dy = translation_mask[y_i, x_i + width]
43                        value = interpolate(img_slice, x_i-dx, y_i-dy)
44                        self.aligned_stack[channel][y_i, x_i] = value
45
46        return self.aligned_stack.astype(input_d_type)
class ChannelRegistrationCorrector:
 8class ChannelRegistrationCorrector(object):
 9    def __init__(self):
10        self.aligned_stack = None
11
12    def load_translation_masks(self, path=None):
13        if path is not None:
14            path = input("Please provide a filepath to the translation masks")
15
16        return imread(path)
17
18    def align_channels(self, img_stack, translation_masks=None):
19        
20        translation_masks = translation_masks
21
22        if translation_masks is None:
23            translation_masks = self.load_translation_masks()
24
25        input_d_type = img_stack.dtype
26
27        n_channels = img_stack.shape[0]
28        height = img_stack.shape[1]
29        width = img_stack.shape[2]
30
31        self.aligned_stack = np.empty((n_channels, height, width))
32        channels_list = list(range(n_channels))
33
34        for channel in channels_list:
35            img_slice = img_stack[channel].astype(np.float32)
36            translation_mask = translation_masks[channel]
37            if np.sum(translation_mask) == 0:
38                self.aligned_stack[channel] = img_slice
39            else:
40                for y_i in range(height):
41                    for x_i in range(width):
42                        dx = translation_mask[y_i, x_i]
43                        dy = translation_mask[y_i, x_i + width]
44                        value = interpolate(img_slice, x_i-dx, y_i-dy)
45                        self.aligned_stack[channel][y_i, x_i] = value
46
47        return self.aligned_stack.astype(input_d_type)
aligned_stack
def load_translation_masks(self, path=None):
12    def load_translation_masks(self, path=None):
13        if path is not None:
14            path = input("Please provide a filepath to the translation masks")
15
16        return imread(path)
def align_channels(self, img_stack, translation_masks=None):
18    def align_channels(self, img_stack, translation_masks=None):
19        
20        translation_masks = translation_masks
21
22        if translation_masks is None:
23            translation_masks = self.load_translation_masks()
24
25        input_d_type = img_stack.dtype
26
27        n_channels = img_stack.shape[0]
28        height = img_stack.shape[1]
29        width = img_stack.shape[2]
30
31        self.aligned_stack = np.empty((n_channels, height, width))
32        channels_list = list(range(n_channels))
33
34        for channel in channels_list:
35            img_slice = img_stack[channel].astype(np.float32)
36            translation_mask = translation_masks[channel]
37            if np.sum(translation_mask) == 0:
38                self.aligned_stack[channel] = img_slice
39            else:
40                for y_i in range(height):
41                    for x_i in range(width):
42                        dx = translation_mask[y_i, x_i]
43                        dy = translation_mask[y_i, x_i + width]
44                        value = interpolate(img_slice, x_i-dx, y_i-dy)
45                        self.aligned_stack[channel][y_i, x_i] = value
46
47        return self.aligned_stack.astype(input_d_type)